#include <signal.h>
#include <stdio.h>
#include <string.h>
#include <wiringPi.h>
#include <sqlite3.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include "beep.h"

#define SG90_PIN   	2


static int i ;
// 垃圾桶角度
int angle;
int oldAngle;


//数据库
extern sqlite3* db;
extern char* errMsg;
extern char databaseName[32];



// sg90 pwm 产生角度
void sigHandler(int signum)
{
    switch (signum) {
      case SIGALRM:
          // angel   0     45    90      135    180
          //  i      0.5ms 1.0ms 1.5ms   2.0ms  2.5ms
          // count   1     2     3       4	    5
          if (i <= angle) {
              digitalWrite(SG90_PIN, HIGH);
          } else {
              digitalWrite(SG90_PIN, LOW);
          }

          if (i == 40) {
              i = 0;
          }
          i++;
          // sigalrm 沿用unix信号机制，
          // 处理函数结束后会恢复默认信号处理行为，
          signal(SIGALRM, sigHandler);
          break;
      default:
          break;
    }
}

void timerInit()
{
		pinMode(SG90_PIN, OUTPUT);
    // 定时器
    struct itimerval itv;
    memset(&itv, 0, sizeof(itv));
    // 仅设置value，可以定时执行某函数
    // 设置interval，可以定时循环执行某函数
    itv.it_value.tv_sec = 0;
    itv.it_value.tv_usec = 500;
    itv.it_interval.tv_sec = 0;
    itv.it_interval.tv_usec = 500;
    // 每次减到0，会发送SIGALiRM信号
    if (setitimer(ITIMER_REAL, &itv, NULL) == -1) {
        perror("setitimer occurs error");
        exit(0);
    }
    // 信号处理
    signal(SIGALRM, sigHandler);

}





// 开 垃圾桶
/*

source:

0 测距
1 网络
2 语音
*/

void openDustbin(int newAngle,int source)
{

    angle = newAngle;
    if(oldAngle!=newAngle){
      i = 0 ;
      beepMode("beep_on");
    }
    oldAngle=newAngle;



    //create table dustbin(id Integer AUTO_INCREMENT,source Integer,date char(24));
    char insertSql[64]={'\0'} ;
    sprintf(insertSql,"insert into dustbin(source,date) values(%d,%ld);",source,time(NULL));
    int ret = sqlite3_exec(db,insertSql,NULL,NULL,&errMsg);

    if(ret!=0){
        printf("line num:%d\n",__LINE__);
        printf("error message:%s\n",errMsg);
        printf("error code:%d\n",sqlite3_errcode(db));
    }


    usleep(50000);
}

// 关 垃圾桶
void closeDustbin(int newAngle)
{

    angle = newAngle;
    // 解决sg90 抽抽问题
    if(oldAngle!=newAngle){
      i = 0 ;
    }
    oldAngle=newAngle;

    usleep(50000);
}
